import scala.collection.mutable.ArrayBuffer

/**
 * 数组相关操作
 */
object chapter3 {

  def main(args: Array[String]): Unit = {
    // 长度固定: Array, 长度变化: ArrayBuffer
    val nums = new Array[Int](10)
    val s = Array("Hello", "World")  // 赋初值时不使用 new
    val b = new ArrayBuffer[Int]()
    // 在尾部添加元素或移除
    b += 1  // 添加单个元素
    b += (1, 2, 3, 4)  // 添加多个元素
    b ++= Array(8, 13, 22)  // 追加任何集合
    b.trimEnd(5)  // 移除最后 5 个元素
    // 任意位置插入或移除
    b.insert(2, 6)  // 插入单个元素
    b.insert(2, 9)  // 插入多个元素
    b.remove(2)  // 移除指定位置的 1 个元素
    b.remove(2, 3)  // 移除从指定位置开始的 3 个元素
    b.toArray  // 转化为 Array
    // for 循环(每两个元素跳, -1则从尾部开始)
    for (i <- 0 until b.length by 2) {
      println(i)
    }
    for (i <- b.indices) print(i)  // 即 i <- 0 until b.length
    for (i <- b.indices.reverse) print(i)  // 即 i <- 0 until b.length by -1
    for (v <- b) println(v)  // foreach
    // 数组转换
    var a = Array(2, 3, 5, 7)
    val result = for (elem <- a) yield 2 * elem  // result => Array(4, 6, 10, 14)
    // 额外做法
    a.filter(_ % 2 == 0).map(2 * _)
    a.filter {_ % 2 == 0}.map {2 * _}
    // 删除所有负元素
    val positionsToKeep = for (i <- a.indices if a(i) >= 0) yield i
    for (j <- positionsToKeep.indices) a(j) = a(positionsToKeep(j))
    a.toBuffer.trimEnd(a.length - positionsToKeep.length)
    // 常用算法
    val bSorted = b.sorted
    val bDescending = b.sortWith(_ > _)  // 提供 sort 的排序方式
    a.mkString("<", ",", ">")  // <1,2,3>
    // 多维数组
    val matrix = Array.ofDim[Double](3, 4)  // 三行四列
    val triangle = new Array[Array[Int]](10)  // 每行长度不同 3 * []
  }

}
